tool
fun <TInput, TOutput, TContext> tool(name: String, description: String, inputSerializer: KSerializer<TInput>, outputSerializer: KSerializer<TOutput>, needsApproval: suspend (input: TInput, options: ToolPredicateOptions<TContext>) -> Boolean? = null, toModelOutput: (TOutput, ToolPredicateOptions<TContext>) -> ToolResultOutput? = null, strict: Boolean = true, inputExamples: List<String> = emptyList(), onInputStart: suspend (streamingId: String) -> Unit? = null, onInputDelta: suspend (streamingId: String, delta: String) -> Unit? = null, onInputAvailable: suspend (toolCallId: String, input: TInput) -> Unit? = null, metadata: Map<String, JsonElement> = emptyMap(), providerExecuted: Boolean = false, providerOptions: Map<String, JsonElement> = emptyMap(), executor: suspend ToolExecutionContext<TContext>.(TInput) -> TOutput): Tool<TInput, TOutput, TContext>
Top-level factory for Tool with a single-value executor. Mirrors v6's tool({...}) ergonomics in an idiomatic common Kotlin shape.
Idiomatic use:
val searchDocsTool = tool<SearchInput, List<SearchResult>, AppContext>(
name = "searchDocs",
description = "Search the product documentation",
inputSerializer = serializer(),
outputSerializer = serializer(),
) { query ->
repository.search(query.query)
}Content copied to clipboard
The user-supplied executor runs once per tool call. Use streamingTool when the tool wants to emit preliminary progress snapshots before the final value.
inline fun <TInput, TOutput, TContext> tool(name: String, description: String, noinline needsApproval: suspend (input: TInput, options: ToolPredicateOptions<TContext>) -> Boolean? = null, noinline toModelOutput: (TOutput, ToolPredicateOptions<TContext>) -> ToolResultOutput? = null, strict: Boolean = true, inputExamples: List<String> = emptyList(), noinline onInputStart: suspend (streamingId: String) -> Unit? = null, noinline onInputDelta: suspend (streamingId: String, delta: String) -> Unit? = null, noinline onInputAvailable: suspend (toolCallId: String, input: TInput) -> Unit? = null, metadata: Map<String, JsonElement> = emptyMap(), providerExecuted: Boolean = false, noinline executor: suspend ToolExecutionContext<TContext>.(TInput) -> TOutput): Tool<TInput, TOutput, TContext>